<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Git</title>
</head><body>[TOPGIT 以补丁形式管理分支]<br/>
[INSTALL]<br/>
sudo apt-get install topgit /* topgit */<br/>
sudo apt-get install graphviz /* 生成图 */<br/>
[HOW TO]<br/>
1.生成TOPIC分支.<br/>
$tg creat [新分支名称,t/new name] [依赖分支,默认是当前分支]<br/>
初始化后会生成.topdeps, .topmsg 2个文件.提交后分支正式生效.<br/>
&#09;.topdeps 依赖文件.显示了当前分支依赖了哪些分支.(需要消除重复依赖关系.)<br/>
&#09;.topmsg &nbsp;说明文件.<br/>
$tg update /* 更新当前分支.从依赖分支上merge 过来. */<br/>
$tg summary /* 查看分支状态. */<br/>
&#09;&gt; 当前分支.<br/>
&#09;0 分支没有提交<br/>
&#09;D 需要更新. /* tg update */<br/>
&#09;B 需要解决冲突. /* git mergetool */<br/>
&#09;! 依赖分支不存在<br/>
&#09;l 分支只存在本地.远端服务器不存在.<br/>
&#09;r 正常.本地存在.远端服务器也存在.<br/>
&#09;R 特性分支.本地比远程版本库新.<br/>
$tg summary --graphviz |dot -T [生成图片类型, png] -o [生成图片文件名.] /* 生成分支图. 需要安装graphviz. */<br/>
<br/>
$tg remote --populate origin &#09;/* 设置远端分支branch为origin */<br/>
$tg push&#09;/* 推送当前分支到远程分支. */<br/>
<br/>
<br/>
<br/>
[GIT SVN共存]<br/>
1.GIT下添加忽略:<br/>
$echo ".svn" &gt;&gt; .gitignore<br/>
<br/>
2.svn下添加忽略:<br/>
$svn add -N target &nbsp; /*target &nbsp;为原GIT管理的文件分支跟目录. -N 为只提交目录.不提交目录下的文件.*/<br/>
$svn propedit svn:ignore target /* 编辑TARGET目录的忽略.(递归的) */<br/>
/*会打开一个编辑窗口.添加要忽略的文件和目录.*/<br/>
.git<br/>
.gitignore<br/>
.topdeps<br/>
.topmsg<br/>
/* 保存.关闭*/<br/>
$svn st /* 则看不到忽略的文件了.然后可以正常提交.*/<br/>
<br/>
[GIT 无法提交]<br/>
服务器.git/config添加:<br/>
[receive]<br/>
denyCurrentBranch = ignore<br/>
<br/>
[REPO]<br/>
repo 命令不多，全部的可以看http://source.android.com/source/using-repo.html<br/>
//初始化，第一次用时，请先看最后“初始化a10 a13”（搜索“初始化a10 a13”）<br/>
repo init &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//repo init -u /git_repo/A10/android4.0/manifest.git<br/>
//同步所有的工程文件<br/>
repo sync<br/>
//同步特定的工程文件<br/>
repo sync PROJECT0 PROJECT1 PROJECT2 ...<br/>
<br/>
//查看远程分支<br/>
repo forall -c git remote -v<br/>
<br/>
//创建分支<br/>
repo start mybranch --all //repo start develop --all<br/>
//分配分支到特定工程<br/>
repo start BRANCH_NAME PROJECT<br/>
<br/>
//验证新分支的有效性<br/>
repo status<br/>
repo forall -c 'pwd &amp;&amp; git status'<br/>
<br/>
//列出分支<br/>
git branch &nbsp; &nbsp; /*或*/<br/>
repo branches &nbsp;/*或*/<br/>
repo branch<br/>
<br/>
//切换到分支develop<br/>
repo checkout develop<br/>
//单个项目切换<br/>
git checkout develop<br/>
<br/>
//该条命令会对repo下的project执行新建并切换branch的命令<br/>
repo forall -c git checkout -b 分支名<br/>
<br/>
<br/>
<br/>
//查看远程分支<br/>
repo forall -c git remote -v<br/>
<br/>
//更新,建议在更新前要建一个备份分支，<br/>
//这样即使新代码有问题，也可以切换会旧的代码分支出软件，新代码稳定后就可以把备份分支删除<br/>
repo checkout develop<br/>
repo forall -c git pull exdroid develop //android<br/>
repo forall -c git pull lichee develop &nbsp;//lichee<br/>
repo checkout mybranch<br/>
repo forall -c git merge develop<br/>
<br/>
<br/>
git init //创建<br/>
/*<br/>
&nbsp; &nbsp;和.git文件夹同目录的.gitignore文件记录该git库的忽略文件和目录，一项忽略占一行<br/>
&nbsp; &nbsp;*/<br/>
git config --global user.name "John Doe"<br/>
git config user.name "John Doe"<br/>
git config --global user.email johndoe@example.com<br/>
git config user.email johndoe@example.com<br/>
<br/>
///////////////////////////////////////////////////////////////////<br/>
//检查改动,工作目录中没暂存的和库中的比较<br/>
git diff<br/>
//工作目录中已暂存的和库中的比较<br/>
git diff --cached<br/>
//工作目录中(不管暂存没暂存)的和库中的比较<br/>
git diff HEAD<br/>
//统计改动<br/>
git diff --stat<br/>
//当前工作目录与另外一个叫'test'分支的差别<br/>
git diff test<br/>
//比较master分支和test分支<br/>
git diff master..test<br/>
//显示当前工作目录下的lib目录与上次提交之间的差别<br/>
git diff HEAD -- ./lib<br/>
<br/>
<br/>
///////////////////////////////////////////////////////////////////<br/>
//git添加文件到git库，并且stage文件更改、删除的记录<br/>
git add . &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//增加所有有效文件<br/>
git add &lt;filename&gt; &nbsp; //增加某文件或文件夹<br/>
<br/>
<br/>
///////////////////////////////////////////////////////////////////<br/>
git commit -m '提交信息'<br/>
git commit -a -m "提交信息"//加上 -a 选项， Git 就会自动把所有已经跟踪过的文件暂存起来一并提交，从而跳过 git add 步骤<br/>
<br/>
////////////////////////////////////////////////////////////////////<br/>
//补丁, 1b6d 是has<br/>
git diff 1b6d &gt; my.patch<br/>
git format-patch 1b6d &nbsp; &nbsp; &nbsp;//更正式<br/>
git apply &lt; my.patch<br/>
<br/>
<br/>
////////////////////////////////////////////////////////////////////<br/>
//修改最后一次提交<br/>
git commit --amend<br/>
//取消已经暂存的文件<br/>
git reset HEAD &lt;file&gt;...<br/>
//取消对文件的修改<br/>
git checkout -- &lt;file&gt;...<br/>
//从暂存区中移除文件<br/>
git reset HEAD filename //&lt;没测试&gt;<br/>
//<br/>
git reset --hard HEAD~3 // 会将最新的3次提交全部重置，就像没有提交过一样//&lt;没测试&gt;<br/>
//<br/>
git reset --hard commit (38679ed709fd0a3767b79b93d0fba5bb8dd235f8) //回退到 38679ed709fd0a3767b79b93d0fba5bb8dd235f8 版本//&lt;没测试&gt;<br/>
<br/>
&#09;///////////////////////////////////////////////////////////////////<br/>
&#09;//查看已有的标签<br/>
&#09;git tag<br/>
&#09;git tag -l v1.1.* &nbsp; &nbsp; &nbsp; &nbsp;//列出以V1.1.*开始的tag<br/>
&#09;//新建标签<br/>
&#09;git tag v1.1.1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //轻量级标签<br/>
&#09;git tag -a v1.1.1 -m 'my version 1.1.1' &nbsp; &nbsp;//带注释的标签,是git仓库中的对象<br/>
&#09;//后期标签<br/>
&#09;git log –pretty=oneline &nbsp; &nbsp; &nbsp; //查检校和<br/>
&#09;git tag -a v1.2 检校和<br/>
&#09;//查看某标签内容<br/>
&#09;git show v1.1.1<br/>
&#09;//共享标签<br/>
&#09;git push –tags<br/>
&#09;//查看修改<br/>
&#09;repo forall -c git log --since="2012-06-01" --until="2012-06-7" &nbsp; //按条件查看工程所有仓库修改记录<br/>
&#09;git log --since="2 days ago" --until="1 hour ago"<br/>
&#09;//查看提交记录:前4次的修改<br/>
&#09;git log --stat -4<br/>
&#09;//查看提交记录:前2次的修改内容<br/>
&#09;git log -p -2<br/>
&#09;//log graph<br/>
&#09;git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen (%cr) %C(bold blue)&lt;%an&gt;%Creset' --abbrev-commit --<br/>
&#09;//配置log<br/>
&#09;//git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen (%cr) %C(bold blue)&lt;%an&gt;%Creset' --abbrev-commit --"<br/>
&#09;git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %C(green)%s &nbsp;%C(reset)(%cr) %C(bold blue)&lt;%an&gt;%Creset' --abbrev-commit --"<br/>
<br/>
&#09;///////////////<br/>
&#09;git stash：在第一篇中，我举了一个使用branch解决紧急任务切换的问题，其实stash命令也可以很好的解决这样的问题。<br/>
&#09;当你不想提交当前完成了一半的代码，但是却不得不修改一个紧急Bug，那么使用'git stash'就可以将你当前未提交到本地（和服务器）的代码推入到Git的栈中，<br/>
&#09;这时候你的工作区间和上一次提交的内容是完全一样的，所以你可以放心的修 Bug，等到修完Bug，提交到服务器上后，<br/>
&#09;再使用'git stash apply'将以前一半的工作应用回来。<br/>
&#09;也许有的人会说，那我可不可以多次将未提交的代码压入到栈中？答案是可以的。<br/>
&#09;当你多次使用'git stash'命令后，你的栈里将充满了未提交的代码，这时候你会对将哪个版本应用回来有些困惑，<br/>
&#09;'git stash list'命令可以将当前的Git栈信息打印出来，你只需要将找到对应的版本号，<br/>
&#09;例如使用'git stash apply stash@{1}'就可以将你指定版本号为stash@{1}的工作取出来，<br/>
&#09;当你将所有的栈都应用回来的时候，可以使用'git stash clear'来将栈清空<br/>
<br/>
&#09;it format-patch：当你想给一个开源项目（例如Rails）提交一段代码的时候，或者你想给小组成员展示一段你并不想提交的代码，<br/>
&#09;那么你还是需要 patch的，Git的'format-patch'命令良好的支持了这个功能。<br/>
&#09;我来基本描述一下使用这个命令的步骤和方法：第一，利用branch命令创建一个分支；<br/>
&#09;第二，修改你的代码；<br/>
&#09;第三，在该分支上提交你的修改；<br/>
&#09;第四，使用'git format-patch'命令来生成一个patch文件，<br/>
&#09;例如：'git format-patch master --stdout &gt; ~/Desktop/tmp.patch'<br/>
&#09;就是将工作分支与master主干的不同，存放在'~/Desktop'文件夹下，生成一个叫做 tmp.patch的文件<br/>
&#09;（另一种简单的版本是利用diff命令，例如'git diff ..master &gt; ~/Desktop/tmp.patch'），这样就生成了patch文件。<br/>
&#09;那么别人就可以使用'git apply'命令来应用patch，例如'git apply ~/Desktop/tmp.patch'就是将patch打在当前的工作分支上<br/>
&#09;///////////////<br/>
<br/>
&#09;////////////////////////////////////////////////////////////////////////////////////<br/>
&#09;///////////////////初始化a10 a13////////////////////////////////////////////////////<br/>
&#09;////////////////////////////////////////////////////////////////////////////////////<br/>
&#09;//初始化a10 android repo-git 版本库，此后要修改.repo/manifest.xml的fetch等<br/>
&#09;repo init -u /git_repo/A10/android4.0/manifest.git<br/>
&#09;/*<br/>
&#09; &nbsp; 4 &lt;remote name="exdroid"<br/>
&#09; &nbsp; 5 fetch="/git_repo/A10/android4.0" /&gt;<br/>
&#09; &nbsp; 6 &lt;default revision="develop" //远程分支名<br/>
&#09; &nbsp; 7 remote="exdroid" //远程名字<br/>
&#09; &nbsp; 8 sync-j="4" /&gt;<br/>
&#09; &nbsp; */<br/>
<br/>
&#09;//初始化a10 lichee repo-git 版本库，此后要修改.repo/manifest.xml的fetch等<br/>
&#09;repo init -u /git_repo/A10/lichee/manifest.git -m lichee.xml<br/>
&#09;/*<br/>
&#09; &nbsp; 4 &lt;remote name="lichee"<br/>
&#09; &nbsp; 5 fetch="/git_repo/A10/lichee" /&gt;<br/>
&#09; &nbsp; 6 &lt;default revision="develop" //远程分支名<br/>
&#09; &nbsp; 7 remote="lichee" //远程名字<br/>
&#09; &nbsp; 8 sync-j="4" /&gt;<br/>
&#09; &nbsp; */<br/>
<br/>
&#09;//a13 android<br/>
&#09;repo init -u /git_repo/A13/android4.0/manifest.git -m android_a13.xml<br/>
&#09;/*<br/>
&#09; &nbsp; 4 &lt;remote name="exdroid"<br/>
&#09; &nbsp; 5 fetch="/git_repo/A13/android4.0" /&gt;<br/>
&#09; &nbsp; 6 &lt;default revision="develop" //远程分支名<br/>
&#09; &nbsp; 7 remote="exdroid" //远程名字<br/>
&#09; &nbsp; 8 sync-j="4" /&gt;<br/>
&#09; &nbsp; */<br/>
<br/>
&#09;//a13 lichee<br/>
&#09;repo init -u /git_repo/A13/lichee/manifest.git -m lichee_a13.xml<br/>
&#09;/*<br/>
&#09; &nbsp; 4 &lt;remote name="lichee"<br/>
&#09; &nbsp; 5 fetch="/git_repo/A13/lichee" /&gt;<br/>
&#09; &nbsp; 6 &lt;default revision="develop" //远程分支名<br/>
&#09; &nbsp; 7 remote="lichee" //远程名字<br/>
&#09; &nbsp; 8 sync-j="4" /&gt;<br/>
&#09; &nbsp; */<br/>
<br/>
<br/>
</body></html>